/**
 * phantomjs script for printing presentations to PDF.
 *
 * Example:
 * phantomjs print-pdf.js "http://revealjs.com?print-pdf" reveal-demo.pdf
 *
 * @author Manuel Bieh (https://github.com/manuelbieh)
 * @author Hakim El Hattab (https://github.com/hakimel)
 * @author Manuel Riezebosch (https://github.com/riezebosch)
 */

// html2pdf.js
var system = require('system');

var probePage = new WebPage();
var printPage = new WebPage();

var inputFile = system.args[1] || 'index.html?print-pdf';
var outputFile = system.args[2] || 'slides.pdf';

if (outputFile.match(/\.pdf$/gi) === null) {
    outputFile += '.pdf';
}

console.log('Export PDF: Reading reveal.js config [1/4]');

probePage.open(inputFile, function (status) {

    console.log('Export PDF: Preparing print layout [2/4]');

    var config = probePage.evaluate(function () {
        return Reveal.getConfig();
    });

    if (config) {

        printPage.paperSize = {
            width: Math.floor(config.width * (1 + config.margin)),
            height: Math.floor(config.height * (1 + config.margin)),
            border: 0
        };

        printPage.open(inputFile, function (status) {
            console.log('Export PDF: Preparing pdf [3/4]')
            printPage.evaluate(function () {
                Reveal.isReady() ? window.callPhantom() : Reveal.addEventListener('pdf-ready', window.callPhantom);
            });
        });

        printPage.onCallback = function (data) {
            // For some reason we need to "jump the queue" for syntax highlighting to work.
            // See: http://stackoverflow.com/a/3580132/129269
            setTimeout(function () {
                console.log('Export PDF: Writing file [4/4]');
                printPage.render(outputFile);
                console.log('Export PDF: Finished successfully!');
                phantom.exit();
            }, 0);
        };
    } else {

        console.log('Export PDF: Unable to read reveal.js config. Make sure the input address points to a reveal.js page.');
        phantom.exit(1);

    }
});


